# -*- coding: utf-8 -*-
__author__ = 'Rui & Brazeta'
from ClassGraph import Graph
from ClassRDF import RDF
from rdflib.graph import ConjunctiveGraph
import rdflib

sair = False
simpleGraph = Graph()
rdfLibGraph = RDF()
grafoConjuntivo = ConjunctiveGraph()

while not sair:
    try:
        print("")
        print("########### Gestão de triplestores ###########")
        print("#################s#############################")
        print("")

        print("Prima (1): Importar triplestore a partir de um ficheiro csv")

        print("Prima (2): Gravar triplestore para o formato NT")
        print("Prima (3): Ler triplestore RDF a partir do formato NT")

        print("Prima (3.1): Gravar triplestore RDF para formato NT")

        print("Prima (4): Gravar triplestore RDF para formato N3")
        print("Prima (5): Ler triplestore RDF a partir do formato N3")

        print("Prima (6): Gravar triplestore RDF para formato XML")
        print("Prima (7): Ler triplestore RDF a partir do formato XML")

        print("Prima (8): Gravar triplestore RDF para base de dados")
        print("Prima (9): Ler triplos da base de dados para a triplestore")

        print("Prima (10): Pesquisar Jogadores de uma equipa")
        print("Prima (11): Pesquisar Jogadores que mudaram de equipa entre temporadas")
        print("Prima (12): Pesquisar Jogadores com media de pontos por jogo superior a um valor especificado")
        print("Prima (13): Pesquisar Jogadores com media de pontos por jogo dentro de um intervalo especificado")
        print("Prima (14): Pesquisar Jogadores cuja media de pontos por jogo aumentou entre temporadas")
        print("Prima (15): Pesquisar Jogadores cuja media de pontos por jogo diminuiu entre temporadas")
        print("Prima (16): Pesquisar Jogadores que mudaram de equipa e aumentaram a media de pontos por jogo")
        print("Prima (17): Pesquisar Jogadores que mudaram de equipa e diminuiram a media de pontos por jogo")

        print("Prima (18): Inferir boa decisão de mudança de equipa")
        print("Prima (19): Inferir para má decisão de mudança de equipa")
        print("Prima (20): Inferir quais os jogadores da Conferência Leste - Zona do Atlântico")
        print("Prima (21): Inferir quais os melhores 10 jogadores da temporada de 2011-2012")
        print("Prima (22): Inferir quais os jogadores numa fase ascendente da carreira")

        print("Prima (pred): Imprimir todos os predicados presentes no grafo em memória")
        print("Prima (add): Adicionar um novo triplo ao grafo em memória")
        print("Prima (pes): Pesquisa simples de triplos")
        print("Prima (remove): Remover um triplo")
        print("Prima (clear): Limpar todos os grafos em memória")

        print("Prima (S): Fechar a consola da aplicação")
        print("")
        print("Insira a operação:")
        opcao = raw_input()

        if opcao == "1":


            print("")
            print("Insira o nome e extensão do ficheiro:")
            nomeFicheiro = raw_input()
            simpleGraph.openFromCSV(nomeFicheiro)
            print("")
            print("Operação realizada com sucesso")
            pass

        elif opcao == "2":

            print("")
            print("Insira o sujeito:")
            sujeito = raw_input()
            print("Insira o predicado:")
            predicado = raw_input()
            print("Insira o objecto:")
            objecto = raw_input()
            print("Insira o nome para o ficheiro: ")
            nomeFicheiro = raw_input()

            print("")

            if sujeito == '':  sujeito = None
            if predicado == '':  predicado = None
            if objecto == '':  objecto = None
            simpleGraph.triplesToNt(nomeFicheiro, sujeito, predicado, objecto)

            print("Operação realizada com sucesso.")
            print("")

            pass

        elif opcao == "3":
            simpleGraph._spo = []

            print("")
            print("Insira o nome do ficheiro:")
            nomeFicheiro = raw_input()
            grafoConjuntivo = rdfLibGraph.readTriplesFileNt(nomeFicheiro)
            print("")
            print("Operação realizada com sucesso.")
            print("")

            pass

        elif opcao == "3.1":
            simpleGraph._spo = []

            print("")
            print("Insira o nome do ficheiro:")
            nomeFicheiro = raw_input()
            rdfLibGraph.saveTriplestoreToNT(nomeFicheiro, grafoConjuntivo)
            print("")
            print("Operação realizada com sucesso.")
            print("")

            pass

        elif opcao == "4":

            if grafoConjuntivo.__len__() == 0:
                print "A triplestore interna no formato RDF não tem elementos."
                print "Por favor preencha a triplestore interna utilizando um dos seguintes métodos:"
                print "1º --> Leitura de uma triplestore a partir de um ficheiro NT"
                print "2º --> Leitura de uma triplestore a partir de um ficheiro N3"
                print "3º --> Leitura de uma triplestore a partir de um ficheiro XML"
                break

            print("")
            print("Insira o nome do ficheiro:")
            nomeFicheiro = raw_input()
            rdfLibGraph.saveTriplestoreToN3(nomeFicheiro, grafoConjuntivo)
            print("Operação realizada com sucesso.")
            print("")

            pass

        elif opcao == "5":
            simpleGraph._spo = []

            print("")
            print("Insira o nome do ficheiro:")
            nomeFicheiro = raw_input()
            grafoConjuntivo = rdfLibGraph.readTriplesFileN3(nomeFicheiro)
            print("")
            print("Operação realizada com sucesso.")
            print("")
            pass

        elif opcao == "6":

            if grafoConjuntivo.__len__() == 0:
                print "A triplestore interna no formato RDF não tem elementos."
                print "Por favor preencha a triplestore interna utilizando um dos seguintes métodos:"
                print "1º --> Leitura de uma triplestore a partir de um ficheiro NT"
                print "2º --> Leitura de uma triplestore a partir de um ficheiro N3"
                print "3º --> Leitura de uma triplestore a partir de um ficheiro XML"
                break

            print("")
            print("Insira o nome do ficheiro:")
            nomeFicheiro = raw_input()
            rdfLibGraph.saveTriplestoreToXML(nomeFicheiro, grafoConjuntivo)
            print("Operação realizada com sucesso.")
            print("")
            pass

        elif opcao == "7":
            simpleGraph._spo = []

            print("")
            print("Insira o nome do ficheiro:")
            nomeFicheiro = raw_input()
            grafoConjuntivo = rdfLibGraph.readTriplesFileXML(nomeFicheiro)
            print("")
            print("Operação realizada com sucesso.")
            print("")
            pass

        elif opcao == "8":

            simpleGraph._spo = []
            rdfLibGraph.deleteAllDataFomDatabase()
            rdfLibGraph.saveTriplestoreToDatabase(grafoConjuntivo)

            print("")
            print("Operação realizada com sucesso.")
            print("")
            pass

        elif opcao == "9":

            grafoConjuntivo = ConjunctiveGraph()
            simpleGraph._spo = []

            grafoConjuntivo = rdfLibGraph.loadTriplestoreFromDatabase()

            print("")
            print("Operação realizada com sucesso.")
            print("")
            pass

        elif opcao == "10":

            if grafoConjuntivo.__len__() == 0:
                print "A triplestore interna no formato RDF não tem elementos."
                print "Por favor preencha a triplestore interna utilizando um dos seguintes métodos:"
                print "1º --> Leitura de uma triplestore a partir de um ficheiro NT"
                print "2º --> Leitura de uma triplestore a partir de um ficheiro N3"
                print "3º --> Leitura de uma triplestore a partir de um ficheiro XML"
                break

            print('')
            equipa = raw_input("Insira o nome da equipa a pesquisar: ")
            print('')

            resultado = rdfLibGraph.pesquisaJogadoresPorEquipa(equipa, grafoConjuntivo)

            for elemento in resultado:
                print(elemento[0])

            pass

        elif opcao == "11":

            if grafoConjuntivo.__len__() == 0:
                print "A triplestore interna no formato RDF não tem elementos."
                print "Por favor preencha a triplestore interna utilizando um dos seguintes métodos:"
                print "1º --> Leitura de uma triplestore a partir de um ficheiro NT"
                print "2º --> Leitura de uma triplestore a partir de um ficheiro N3"
                print "3º --> Leitura de uma triplestore a partir de um ficheiro XML"
                break

            resultado = rdfLibGraph.pesquisaJogadoresMudaramEquipa(grafoConjuntivo)

            for elemento in resultado:
                print("%s -- %s -- %s" %(elemento[0], elemento[1], elemento[2]))

            pass

        elif opcao == "12":

            if grafoConjuntivo.__len__() == 0:
                print "A triplestore interna no formato RDF não tem elementos."
                print "Por favor preencha a triplestore interna utilizando um dos seguintes métodos:"
                print "1º --> Leitura de uma triplestore a partir de um ficheiro NT"
                print "2º --> Leitura de uma triplestore a partir de um ficheiro N3"
                print "3º --> Leitura de uma triplestore a partir de um ficheiro XML"
                break

            print('')
            ppg = raw_input("Insira o valor mínimo de pontos por jogo a pesquisar: ")
            print('')

            resultado = rdfLibGraph.pesquisaJogadoresMediaPontosJogoMaiorQueValor(ppg, grafoConjuntivo)

            for elemento in resultado:
                print("%s -- %s" %(elemento[0], elemento[1]))

            pass

        elif opcao == "13":

            if grafoConjuntivo.__len__() == 0:
                print "A triplestore interna no formato RDF não tem elementos."
                print "Por favor preencha a triplestore interna utilizando um dos seguintes métodos:"
                print "1º --> Leitura de uma triplestore a partir de um ficheiro NT"
                print "2º --> Leitura de uma triplestore a partir de um ficheiro N3"
                print "3º --> Leitura de uma triplestore a partir de um ficheiro XML"
                break

            print('')
            valorMenor = raw_input("Insira o valor do intervalo menor: ")
            print('')
            valorMaior = raw_input("Insira o valor do intervalo maior: ")
            print('')

            resultado = rdfLibGraph.pesquisaJogadoresMediaPontosEmIntervalo(valorMenor, valorMaior, grafoConjuntivo)

            for elemento in resultado:
                print("%s -- %s" %(elemento[0], elemento[1]))

            pass

        elif opcao == "14":

            if grafoConjuntivo.__len__() == 0:
                print "A triplestore interna no formato RDF não tem elementos."
                print "Por favor preencha a triplestore interna utilizando um dos seguintes métodos:"
                print "1º --> Leitura de uma triplestore a partir de um ficheiro NT"
                print "2º --> Leitura de uma triplestore a partir de um ficheiro N3"
                print "3º --> Leitura de uma triplestore a partir de um ficheiro XML"
                break

            resultado = rdfLibGraph.pesquisaJogadoresAumentaramPontosEntreSeasons(grafoConjuntivo)

            for elemento in resultado:
                print("%s -- %s -- %s" %(elemento[0], elemento[1], elemento[2]))

            pass

        elif opcao == "15":

            if grafoConjuntivo.__len__() == 0:
                print "A triplestore interna no formato RDF não tem elementos."
                print "Por favor preencha a triplestore interna utilizando um dos seguintes métodos:"
                print "1º --> Leitura de uma triplestore a partir de um ficheiro NT"
                print "2º --> Leitura de uma triplestore a partir de um ficheiro N3"
                print "3º --> Leitura de uma triplestore a partir de um ficheiro XML"
                break

            resultado = rdfLibGraph.pesquisaJogadoresDiminuiramPontosEntreSeasons(grafoConjuntivo)

            for elemento in resultado:
                print("%s -- %s -- %s" %(elemento[0], elemento[1], elemento[2]))

            pass

        elif opcao == "16":

            if grafoConjuntivo.__len__() == 0:
                print "A triplestore interna no formato RDF não tem elementos."
                print "Por favor preencha a triplestore interna utilizando um dos seguintes métodos:"
                print "1º --> Leitura de uma triplestore a partir de um ficheiro NT"
                print "2º --> Leitura de uma triplestore a partir de um ficheiro N3"
                print "3º --> Leitura de uma triplestore a partir de um ficheiro XML"
                break

            resultado = rdfLibGraph.pesquisaJogadoresBoaMudancaEquipa(grafoConjuntivo)

            for elemento in resultado:
                print("%s -- %s -- %s -- %s -- %s" %(elemento[0], elemento[1], elemento[2], elemento[3], elemento[4]))

            pass

        elif opcao == "17":

            if grafoConjuntivo.__len__() == 0:
                print "A triplestore interna no formato RDF não tem elementos."
                print "Por favor preencha a triplestore interna utilizando um dos seguintes métodos:"
                print "1º --> Leitura de uma triplestore a partir de um ficheiro NT"
                print "2º --> Leitura de uma triplestore a partir de um ficheiro N3"
                print "3º --> Leitura de uma triplestore a partir de um ficheiro XML"
                break

            resultado = rdfLibGraph.pesquisaJogadoresMaMudancaEquipa(grafoConjuntivo)

            for elemento in resultado:
                print("%s -- %s -- %s -- %s -- %s" %(elemento[0], elemento[1], elemento[2], elemento[3], elemento[4]))

            pass

        elif opcao == "18":

            if grafoConjuntivo.__len__() == 0:
                print "A triplestore interna no formato RDF não tem elementos."
                print "Por favor preencha a triplestore interna utilizando um dos seguintes métodos:"
                print "1º --> Leitura de uma triplestore a partir de um ficheiro NT"
                print "2º --> Leitura de uma triplestore a partir de um ficheiro N3"
                print "3º --> Leitura de uma triplestore a partir de um ficheiro XML"
                break

            resultado = rdfLibGraph.inferirBoaDecisaoMudancaEquipa(grafoConjuntivo)

            for elemento in resultado:
                grafoConjuntivo.addN((elemento[0], elemento[1], elemento[2]))
                print("%s -- %s -- %s" %(elemento[0], elemento[1], elemento[2]))

            pass

        elif opcao == "19":

            if grafoConjuntivo.__len__() == 0:
                print "A triplestore interna no formato RDF não tem elementos."
                print "Por favor preencha a triplestore interna utilizando um dos seguintes métodos:"
                print "1º --> Leitura de uma triplestore a partir de um ficheiro NT"
                print "2º --> Leitura de uma triplestore a partir de um ficheiro N3"
                print "3º --> Leitura de uma triplestore a partir de um ficheiro XML"
                break

            resultado = rdfLibGraph.inferirMaDecisaoMudancaEquipa(grafoConjuntivo)

            for elemento in resultado:
                grafoConjuntivo.addN((elemento[0], elemento[1], elemento[2]))
                print("%s -- %s -- %s" %(elemento[0], elemento[1], elemento[2]))

            pass

        elif opcao == "20":

            if grafoConjuntivo.__len__() == 0:
                print "A triplestore interna no formato RDF não tem elementos."
                print "Por favor preencha a triplestore interna utilizando um dos seguintes métodos:"
                print "1º --> Leitura de uma triplestore a partir de um ficheiro NT"
                print "2º --> Leitura de uma triplestore a partir de um ficheiro N3"
                print "3º --> Leitura de uma triplestore a partir de um ficheiro XML"
                break

            resultado = rdfLibGraph.inferirJogadoresConferenciaLeste(grafoConjuntivo)

            for elemento in resultado:
                grafoConjuntivo.add((elemento[0], elemento[1], elemento[2]))
                print("%s -- %s -- %s" %(elemento[0], elemento[1], elemento[2]))

            pass

        elif opcao == "21":

            if grafoConjuntivo.__len__() == 0:
                print "A triplestore interna no formato RDF não tem elementos."
                print "Por favor preencha a triplestore interna utilizando um dos seguintes métodos:"
                print "1º --> Leitura de uma triplestore a partir de um ficheiro NT"
                print "2º --> Leitura de uma triplestore a partir de um ficheiro N3"
                print "3º --> Leitura de uma triplestore a partir de um ficheiro XML"
                break

            resultado = rdfLibGraph.inferirTopPlayers_2011_2012(grafoConjuntivo)

            for elemento in resultado:

                rdfNameSpace = rdflib.Namespace("SemanticWebMSI://")
                predicate = rdflib.URIRef(rdfNameSpace["classification_2011_2012"])
                object = rdflib.Literal("Top_Player")

                grafoConjuntivo.add((elemento[0], predicate, object))
                print(elemento)
                print(predicate)
                print(object)

            pass

        elif opcao == "22":

            if grafoConjuntivo.__len__() == 0:
                print "A triplestore interna no formato RDF não tem elementos."
                print "Por favor preencha a triplestore interna utilizando um dos seguintes métodos:"
                print "1º --> Leitura de uma triplestore a partir de um ficheiro NT"
                print "2º --> Leitura de uma triplestore a partir de um ficheiro N3"
                print "3º --> Leitura de uma triplestore a partir de um ficheiro XML"
                break

            resultado = rdfLibGraph.inferirJogadoresAscendenteCarreira(grafoConjuntivo)

            for elemento in resultado:
                grafoConjuntivo.add((elemento[0], elemento[1], elemento[2]))
                print("%s -- %s -- %s" %(elemento[0], elemento[1], elemento[2]))

            pass

        elif opcao == "23":

            if grafoConjuntivo.__len__() == 0:
                print "A triplestore interna no formato RDF não tem elementos."
                print "Por favor preencha a triplestore interna utilizando um dos seguintes métodos:"
                print "1º --> Leitura de uma triplestore a partir de um ficheiro NT"
                print "2º --> Leitura de uma triplestore a partir de um ficheiro N3"
                print "3º --> Leitura de uma triplestore a partir de um ficheiro XML"
                break

            resultado = rdfLibGraph.inferirJogadoresFaseDescendenteCarreira(grafoConjuntivo)

            for elemento in resultado:
                grafoConjuntivo.add((elemento[0], elemento[1], elemento[2]))
                print("%s -- %s -- %s" %(elemento[0], elemento[1], elemento[2]))

            pass

        elif opcao == "pred":

            if grafoConjuntivo.__len__() == 0:
                print "A triplestore interna no formato RDF não tem elementos."
                print "Por favor preencha a triplestore interna utilizando um dos seguintes métodos:"
                print "1º --> Leitura de uma triplestore a partir de um ficheiro NT"
                print "2º --> Leitura de uma triplestore a partir de um ficheiro N3"
                print "3º --> Leitura de uma triplestore a partir de um ficheiro XML"
                break

            predicados = set(grafoConjuntivo.predicates())
            for predicado in predicados:
                print predicado

            pass

        elif opcao == "add":

            print("")
            print("Defina um Namespace:")
            namespace = raw_input()
            print("Insira o sujeito:")
            sujeito = raw_input()
            print("Insira o predicado:")
            predicado = raw_input()
            print("Insira o objecto (será sempre um literal):")
            objecto = raw_input()

            rdfNameSpace = rdflib.Namespace(namespace)
            subject = rdflib.URIRef(rdfNameSpace[sujeito])
            predicate = rdflib.URIRef(rdfNameSpace[predicado])
            object = rdflib.Literal(objecto)

            grafoConjuntivo.add((subject, predicate, object))

            print("Operação realizada com sucesso.")
            print("")

            resultado = grafoConjuntivo.triples((subject, predicate, object))
            for elemento in resultado:
                print(elemento)

            pass

        elif opcao == "remove":

            print("Insira o sujeito:")
            sujeito = raw_input()
            print("Insira o predicado:")
            predicado = raw_input()
            print("Insira o objecto (será sempre um literal):")
            objecto = raw_input()

            subject = rdflib.URIRef(sujeito)
            predicate = rdflib.URIRef(predicado)
            object = rdflib.Literal(objecto)

            grafoConjuntivo.remove((subject, predicate, object))

            print("Operação realizada com sucesso.")
            print("")

            pass


        elif opcao == "pes":

            print("Insira o sujeito (deve conter um namespace):")
            sujeito = raw_input()
            print("Insira o predicado (deve conter um namespace):")
            predicado = raw_input()
            print("Insira o objecto (deverá ser um literal):")
            objecto = raw_input()

            if sujeito == "":
                subject = None
            else:
                subject = rdflib.term.URIRef(sujeito)

            if predicado == "":
                predicate = None
            else:
                predicate = rdflib.term.URIRef(predicado)

            if objecto == "":
                object = None
            else:
                object = rdflib.Literal(objecto)

            resultado = grafoConjuntivo.triples((subject, predicate, object))
            for elemento in resultado:
                print(elemento)

            pass

        elif opcao == "clear":

            grafoConjuntivo = ConjunctiveGraph()
            simpleGraph._spo = []

            pass

        elif opcao == 'S':
            sair = True
            pass

        else:
            print("")
            print("Opção inválida.")
            print("")
            pass

    except Exception as inst:
        print()
        print("Erro --> ", inst)
        print()

print("A terminar...")


